﻿using System;
using System.Data.Objects;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Arquitetura.Model;

namespace Arquitetura.DataLayer
{
    public class PessoaFisicaData : IPessoaFisicaData
    {
        #region Constantes
        private const string PessoaSet = "PessoaSet";
        #endregion

        #region Atributos
        private ArquiteturaModelContainer m_arquiteturaModelContainer;
        #endregion

        #region Construtores
        public PessoaFisicaData()
        {
            m_arquiteturaModelContainer = new ArquiteturaModelContainer();
            m_arquiteturaModelContainer.PessoaSet.MergeOption = MergeOption.NoTracking;
        }
        #endregion

        #region Métodos
        public Resultado<IQueryable<PessoaFisica>> Select()
        {
            try
            {
                return new Resultado<IQueryable<PessoaFisica>>(
                    from pessoa in m_arquiteturaModelContainer.PessoaSet
                    where pessoa is PessoaFisica
                    select pessoa as PessoaFisica);
            }
            catch (Exception ex)
            {
                return new Resultado<IQueryable<PessoaFisica>>(ex);
            }
        }

        public Resultado Insert(PessoaFisica pessoaFisica)
        {
            try
            {
                m_arquiteturaModelContainer.InsertEntity(pessoaFisica, PessoaSet);
                return new Resultado(true);
            }
            catch (Exception ex)
            {
                return new Resultado(ex);
            }
        }

        public Resultado Update(PessoaFisica pessoaFisica)
        {
            try
            {
                m_arquiteturaModelContainer.UpdateEntity(pessoaFisica);
                return new Resultado(true);
            }
            catch (Exception ex)
            {
                return new Resultado(ex);
            }
        }

        public Resultado Delete(PessoaFisica pessoaFisica)
        {
            try
            {
                m_arquiteturaModelContainer.DeleteEntity(pessoaFisica);
                return new Resultado(true);
            }
            catch (Exception ex)
            {
                return new Resultado(ex);
            }
        }

        public void Dispose()
        {
            m_arquiteturaModelContainer.Dispose();
        }
        #endregion
    }
}
